package com.tianyadu.order.examples;

import com.tianyadu.order.config.GirlConfig;
import com.tianyadu.product.client.ProductClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @FileName: ClientExamples
 * @Description: 模拟客户端调用server信息
 * @author: xueyj
 * @create: 2018-11-21 14:37
 */
@RestController
@Slf4j
public class ClientExamples {

    @Autowired
    private GirlConfig girlConfig;
    /**
      * @Description: 通过resttemple,调用单一地址服务端数据
      * @param:
      * @return:
      * @author:
      * @date:   2018/11/21 14:39
      */
    @GetMapping("/get/server_response1")
    public String getServerResponseInfo1() {
        log.info("获取配置文件girlConfig信息，name = 【{}】",girlConfig.getName());
        // 初始化restTemplate
        RestTemplate restTemplate = new RestTemplate();
        //  定义请求服务端地址
        String serverUrl = "http://127.0.0.1:8081/get/server/string";
        //  调用服务端信息，获取返回信息
        String templateForObject = restTemplate.getForObject(serverUrl, String.class);
        log.info("调用服务端，响应数据 templateForObject=【{}】", templateForObject);
        return "";
    }

    @Autowired
    private LoadBalancerClient balancerClient;
    /**
     * @Description: 通过springCloud的LoadBalancerClient,获取product服务注册信息，
     * 动态组装请求服务端地址，通过通过resttemple方式，调用服务端数据
     * @param:
     * @return:
     * @author:
     * @date:   2018/11/21 14:39
     */
    @GetMapping("/get/server_response2")
    public String getServerResponseInfo2() {
        log.info("获取配置文件girlConfig信息，name = 【{}】",girlConfig.getName());
        // 获取eureka服务注册中心product信息
        ServiceInstance productServer = balancerClient.choose("PRODUCT");
        // 获取product服务的host信息
        String host = productServer.getHost();
        // 获取product服务的port信息
        int port = productServer.getPort();
        //  拼接请求服务端地址
        String serverUrl = String.format("http://%s:%s", host, port + "/get/server/string");

        // 初始化restTemplate
        RestTemplate restTemplate = new RestTemplate();
        //  调用服务端信息，获取返回信息
        String templateForObject = restTemplate.getForObject(serverUrl, String.class);
        log.info("调用服务端，响应数据 templateForObject=【{}】", templateForObject);
        return "";
    }

    @Autowired
    private RestTemplate restTemplate;

    /**
      * @Description: 利用 @LoadBalanced，可在restTemplate里面直接使用product应用名称调用服务信息
      * @param:
      * @return:
      * @author:
      * @date:   2018/11/21 15:30
      */
    @GetMapping("/get/server_response3")
    public String getServerResponseInfo3() {
        log.info("获取配置文件girlConfig信息，name = 【{}】",girlConfig.getName());
        //  调用服务端信息，获取返回信息
        //  拼接请求服务端地址
        String serverUrl = "http://PRODUCT/get/server/string";
        String templateForObject = restTemplate.getForObject(serverUrl, String.class);
        log.info("调用服务端，响应数据 templateForObject=【{}】", templateForObject);
        return "";
    }


    @Autowired
    private ProductClient productClient;
    /**
      * @Description: 通过feign组建，获取服务端信息
      * @param:
      * @return:
      * @author:
      * @date:   2018/11/21 16:43
      */
    @GetMapping("/get/server_response4")
    public String getServerResponseInfo4() {
        log.info("获取配置文件girlConfig信息，name = 【{}】",girlConfig.getName());
        String productMsg = productClient.getString();
        log.info("调用服务端，响应数据 productMsg=【{}】", productMsg);
        return "";
    }
}